/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package servidor;

import java.io.*;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import sop_corba.Callback;
import sop_corba.JuegoPOA;

/**
 *
 * @author familia
 */
public class JuegoImpl extends JuegoPOA{
    
    private int [][] tablero = new int[3][3];
    private int ganador;
    private ArrayList <Usuario> usuarios = new ArrayList();
    private ArrayList<Callback> jugadores = new ArrayList();
    private int maxjugadores = 0;
    
    
    public JuegoImpl(){}

    @Override
    public int numJugadores() {
         return maxjugadores;
    }

    @Override
    public void Reiniciar() {
         for(int i=0;i<jugadores.size();i++){
            jugadores.get(i).reiniciar();
        }
    }

    @Override
    public int Ganador() {
        return ganador;
    }
    private void hacerCallback(int n, int m, int id, String nom) {
        
        
        for(int i=0;i<jugadores.size();i++){
            jugadores.get(i).recibirMsg(n, m, id, nom);
        }
    }
    @Override
    public void Cargar(int n, int m, int id, String nombre) {
        hacerCallback(n, m, id, nombre);
        Bloquear(id);
    }

    @Override
    public int RegCallbck(Callback obj, String nombre) {
        if (jugadores.size()==2){
            return 2;
        }
        else if(jugadores.isEmpty()){
            obj.id(1);
            obj.login(nombre);
            jugadores.add(obj);
            maxjugadores++;
            return 1;
        }
        else if(jugadores.size()==1){
            if(!jugadores.get(0).login().equals(nombre)) {
                obj.id(2);
                obj.login(nombre);
                jugadores.add(obj);
                maxjugadores++;
                return 1;
            }
            else{
                return 0;
            }
        }
        return 2;
    }

    @Override
    public boolean Buscar_Usuario(String login, String password) {
         System.out.println("paso nada");
        try {
            if(Obtener_Usuario(login,password).getLogin().equals(login)&&Obtener_Usuario(login,password).getPassword().equals(password))
            {
                return true;
            }
            else
                return false;
            
        } catch (FileNotFoundException ex) {
            Logger.getLogger(JuegoImpl.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(JuegoImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        return false;
    }
    public Usuario Obtener_Usuario(String log, String password) throws FileNotFoundException, IOException {
        
        
        
        String nom="no",ape="no", lo="no",pas="no";
        
        File archivoU = new File("../bin/servidor/usuarios/users.txt");
        FileReader frU = new FileReader(archivoU);
        BufferedReader brU = new BufferedReader(frU);
        String lineaU;
        String login = log;
        String pass = password;
       String lin;
         
                 /* ciclo en el cual se escanea el achivo de administradores para ver si 
                 el usuario  se encuentra en él*/
                
                while((lineaU=brU.readLine())!=null)
                {
                    if(lineaU.equals(login))
                    {
                        lo=lineaU;                        
                        nom=brU.readLine();
                        ape=brU.readLine();
                        pas=brU.readLine();
                                              
                    }
                          
                }
            frU.close();
            Usuario temp1 = new Usuario(nom,ape,lo,pas);
            
            return temp1;
    }
    
    @Override
    public boolean Registrarse_Usuario(String nombre, String apellido, String login, String password)
    {
      
        FileWriter ficheroU = null;
        boolean resultado = false;
        Usuario obj1 = new Usuario(nombre,apellido,login,password);
        try {
            if(buscarUser(login)){
                resultado = false;
            }
            else{
                PrintWriter pwU = null;
                try
                {
                    ficheroU = new FileWriter("../bin/servidor/usuarios/users.txt",true);
                    pwU = new PrintWriter(ficheroU);

                        //pwU.println();
                        pwU.println(login);
                        pwU.println(nombre);
                        pwU.println(apellido);
                        pwU.println(password);

                        ficheroU.close();
                        
                        return true;

                   
                }catch (Exception e) {
                    e.printStackTrace();
            } 
          }
        } catch (IOException ex) {
            Logger.getLogger(JuegoImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        
        return resultado;
    }


    public boolean buscarUser(String log) throws IOException{ 
       File archivoU = new File("../bin/servidor/usuarios/users.txt");   // |-> se establecen la dirrecion de los archivos para ubicar
       FileReader frU = new FileReader(archivoU);
       BufferedReader brU = new BufferedReader(frU);
       
        String lineaU;
        String login = log;
        String lin;
        int band=0;
         
                while((lineaU=brU.readLine())!=null)
                {
                    if(lineaU.equals(login))
                    {
                          band=1;
                    }       
                }
                
            
            frU.close();
            if(band==1){return true;}
            else
                return false;
    }


    @Override
    public void Iniciar_Partida() {
       for (int x=0;x<3;x++)
            for (int y=0;y<3;y++)
                tablero[x][y]=-1;
        ganador=-1;
    }

    @Override
    public void Regitar_Partida(String nombre) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public boolean Comprobar_Tablero() {
       for (int n=0;n<3;n++)
            for (int m=0;m<3;m++)
                if (tablero[n][m]==-1)
                    return false;
        return true;
    }

    @Override
    public boolean Termianr_Partida() {
        return Comprobar_Tablero() || Ganador_Partida()!=-1;
    }

    @Override
    public void Operar_Casillas(int x, int y, int id) {
       if (x>=0 && y>=0 && x<3 && y<3 && tablero[x][y]==-1){
            if (ganador==-1){
                tablero[x][y]=id;
                ganador = Ganador_Partida();
            }
        }
    }
     public int Ganador_Partida(){
        if (tablero[0][0] != -1 && tablero[0][0] == tablero[1][1] && tablero[0][0] == tablero[2][2])
            return tablero[0][0];
        if (tablero[0][2] != -1 && tablero[0][2] == tablero[1][1] && tablero[0][2] == tablero[2][0])
            return tablero[0][2];
        for (int n=0;n<3;n++){
            if (tablero[n][0] != -1 && tablero[n][0] == tablero[n][1]  && tablero[n][0] == tablero[n][2])
                return tablero[n][0];
            if (tablero[0][n] != -1 && tablero[0][n] == tablero[1][n]  && tablero[0][n] == tablero[2][n])
                return tablero[0][n];
        }
        return -1;
    }
     private void Bloquear(int id){
        int oid;
        if(id==1){
            id=0;
            oid=1;
        }
        else{
            id=1;
            oid=0;
        }
        jugadores.get(id).bloquear();
        if(!Termianr_Partida()){
            jugadores.get(oid).desbloquear();
        }
    }
}
